const db = require("../models");
const bcrypt = require("bcryptjs");
const User = db.User;

/**
 * 用户服务层
 * 处理与用户相关的业务逻辑
 */
class UserService {
  /**
   * 创建新用户
   * @param {Object} userData - 用户数据
   * @returns {Promise<Object>} 创建的用户对象
   */
  async create(userData) {
    // 密码加密
    if (userData.password) {
      userData.password = bcrypt.hashSync(userData.password, 10);
    }

    return await User.create(userData);
  }

  /**
   * 根据ID查找用户
   * @param {number} id - 用户ID
   * @returns {Promise<Object>} 用户对象
   */
  async findById(id) {
    return await User.findByPk(id, {
      attributes: { exclude: ["password"] }, // 排除密码字段
    });
  }

  /**
   * 根据用户名查找用户
   * @param {string} username - 用户名
   * @returns {Promise<Object>} 用户对象
   */
  async findByUsername(username) {
    return await User.findOne({ where: { username } });
  }

  /**
   * 根据邮箱查找用户
   * @param {string} email - 邮箱
   * @returns {Promise<Object>} 用户对象
   */
  async findByEmail(email) {
    return await User.findOne({ where: { email } });
  }

  /**
   * 获取所有用户列表
   * @param {Object} options - 查询选项
   * @returns {Promise<Array>} 用户列表
   */
  async findAll(options = {}) {
    const query = {
      attributes: { exclude: ["password"] },
      ...options,
    };
    return await User.findAll(query);
  }

  /**
   * 更新用户信息
   * @param {number} id - 用户ID
   * @param {Object} userData - 更新的用户数据
   * @returns {Promise<Object>} 更新结果
   */
  async update(id, userData) {
    // 如果更新包含密码，需要加密
    if (userData.password) {
      userData.password = bcrypt.hashSync(userData.password, 10);
    }

    return await User.update(userData, {
      where: { id },
    });
  }

  /**
   * 删除用户（软删除）
   * @param {number} id - 用户ID
   * @returns {Promise<number>} 删除的记录数
   */
  async delete(id) {
    return await User.destroy({
      where: { id },
    });
  }

  /**
   * 验证用户密码
   * @param {string} plainPassword - 明文密码
   * @param {string} hashedPassword - 哈希密码
   * @returns {boolean} 验证结果
   */
  verifyPassword(plainPassword, hashedPassword) {
    return bcrypt.compareSync(plainPassword, hashedPassword);
  }

  /**
   * 更新用户最后登录时间
   * @param {number} id - 用户ID
   * @returns {Promise<Object>} 更新结果
   */
  async updateLastLogin(id) {
    return await User.update({ lastLogin: new Date() }, { where: { id } });
  }
}

module.exports = new UserService();
